home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / escalant / escala21.lha / escalante2.1 / src / gfx / Gfx.h < prev    next >
C/C++ Source or Header  |  1993-07-15  |  12KB  |  541 lines

  1. //
  2. //    Copyright (C) 1993  Jeff McWhirter
  3. //
  4. #ifndef GFX_H
  5. #define GFX_H
  6.  
  7. #include    "EscalanteGlobal.h"
  8.  
  9. #include    "Rectangle.h"
  10. #include    "Set.h"
  11.  
  12. #include    "CommonGfx.h"
  13. #include    "PointArray.h"
  14. #include    "Line.h"
  15. #include    "Oval.h"
  16. #include    "Geometry.h"
  17. #include    "VGraphElement.h"
  18.  
  19.  
  20. class Ink*    GetGrey(float);
  21. char*        GetBitmapPath(char * name);
  22.  
  23.  
  24. class Bitmap;
  25. extern Bitmap* MakeBitmap(char*);
  26. extern Bitmap* FindBitmap(char *);
  27.  
  28. extern void MakeColorList();
  29.  
  30.  
  31. inline bool OkToDrawText(){return (GrGetXScale() >=0.6);}
  32.  
  33.  
  34. enum GfxFlags{    
  35.     eGfxBatching    = BIT(eGOLast+1),
  36.     eGfxShown    = BIT(eGOLast+2),
  37.     eGfxDying    = BIT(eGOLast+3),
  38.     eGfxInCalcImage    = BIT(eGOLast+4),
  39.      eGfxFilled    = BIT(eGOLast+5),
  40.     eGfxAttachable    = BIT(eGOLast+6),
  41.     eGfxGuard    = BIT(eGOLast+7),
  42.     eGfxPickable    = BIT(eGOLast+8),
  43.     eGfxPropChanges    = BIT(eGOLast+9),
  44.     eGfxDrawOutline    = BIT(eGOLast+10),
  45.     eGfxInput    = BIT(eGOLast+11),
  46.     eGfxMapW    = BIT(eGOLast+12),
  47.     eGfxMapH    = BIT(eGOLast+13),
  48.     eGfxMapA    = BIT(eGOLast+14),
  49.     eGfxLast    = eGOLast +14
  50.     };
  51.  
  52.  
  53.     
  54.  
  55.  
  56.  
  57. inline ESCALANTEColor PercentToGrey(float perc){
  58. if(perc < 0.05) perc = 0.05;
  59. if(perc > 1.0) perc = 1.0;
  60. ESCALANTEColor c;
  61. c = (ESCALANTEColor)((int)eGrey05 + (int)(perc*100.0/2.5 + 0.5)) ;
  62. if(c < eGrey05)c = eGrey05;
  63. else if(c > eGrey100)c = eGrey100;
  64. return c;
  65. }
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75. class GfxState : public Object{
  76. public:
  77. int    svpensize;
  78. Point    svtextpos;
  79. Ink*    svpenink;
  80. Ink*    svfillink;
  81. Ink*    svtextink;
  82. Font*    svtextfont;
  83.  
  84. int        penwidth;
  85. ESCALANTEColor    pencolor;
  86. ESCALANTEColor    fillcolor;
  87. ESCALANTEFace        textface;
  88. Ink*        fgrey;
  89. Ink*        pgrey;
  90. int        textsize;
  91. ESCALANTEColor    textcolor;
  92. ESCALANTEFont        textfont;
  93.  
  94.  
  95. MetaDef(GfxState)
  96. GfxState();
  97. virtual void    Setup();
  98. virtual void    SaveState();
  99. virtual void    RestoreState();
  100.  
  101. OStream&    PrintOn(OStream& o);
  102. IStream&    ReadFrom(IStream& i );
  103.  
  104. };
  105.  
  106.  
  107.  
  108.  
  109.  
  110. #define Gfx_BASE GraphObject
  111.  
  112.  
  113. class Gfx: public GraphObject{
  114. public:
  115. int        gfx_id;
  116. GfxState*    gfxstate;
  117. class Gfx*    parent;
  118. Rectangle    ibbox;
  119. VGraphElement*    elt;
  120.  
  121. MetaDef(Gfx)
  122.  
  123. Gfx(VGraphElement * elt= 0);
  124. ~Gfx();
  125.  
  126. void InitClone();
  127.  
  128. bool GfxOK(int mask);
  129.  
  130. int GetId(){return gfx_id;}
  131. void SetId(int i){gfx_id = i; Gfx_BASE::SetId(gfx_id);}
  132.  
  133.  
  134. virtual void MakeGfxState(){gfxstate = new GfxState();}
  135. inline void CheckGfxState(){if(!gfxstate)MakeGfxState();}
  136.  
  137.  
  138. virtual void * GetShape(){
  139.     if(DrawOutline()) return (void*)&ibbox;
  140.     else return 0;
  141. }
  142.  
  143. virtual ShapeType GetShapeType(){
  144.     if(DrawOutline()) return eRectangle;
  145.     else return eNullShape;
  146. }
  147.  
  148. virtual void MoveBy(Point&);
  149. virtual void SetDelta(Point &){}
  150.  
  151.  
  152. virtual bool  MyImageTouchesPoint(Point& );
  153. virtual bool  MyImageTouchesRect(Rectangle& );
  154.  
  155. bool PropagateChanges(){
  156.     return (!TestFlag(eGfxPropChanges)?FALSE:
  157.         (parent?parent->PropagateChanges():TRUE));
  158. }
  159. void PropagateChanges(bool f){ SetFlag(eGfxPropChanges,f);}
  160.  
  161.  
  162.  
  163. Gfx *  GetClosestGfx(Gfx * ogfx,
  164.              Point * myp=0,
  165.              Point * op=0,
  166.              Gfx ** minogfx = 0,
  167.              int flags = eGfxShown,
  168.              int * currentmin = 0 );
  169.  
  170. Gfx *  GetClosestGfx(void * g,
  171.              ShapeType type,
  172.              Point * gp=0,
  173.              Point * op=0,
  174.              int flags = eGfxShown,
  175.              int * currentmin = 0 );
  176.  
  177.  
  178. virtual Gfx *  GetClosestGfx2(Gfx * ogfx,
  179.                   Point * myp=0,
  180.                   Point * op=0,
  181.                   Gfx ** minogfx = 0,
  182.                   int flags = eGfxShown,
  183.                   int * currentmin = 0 );
  184.  
  185. virtual Gfx *  GetClosestGfx2(void * g,
  186.                   ShapeType type,
  187.                   Point * gp=0,
  188.                   Point * op=0,
  189.                   int flags = eGfxShown,
  190.                   int * currentmin = 0 );
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197. inline Gfx*  GetClosestGfx(Point &p,Point* gp=0,int flags = eGfxShown, int* currentmin =0 )
  198. {
  199.     return GetClosestGfx((void*)&p, ePoint, gp, 0,flags,currentmin);
  200. }
  201.  
  202. inline Gfx*  GetClosestGfx(Line& p, Point* gp=0, Point*op=0,int flags = eGfxShown, int* currentmin =0 )
  203. {
  204.     return GetClosestGfx((void*)&p, eLine, gp, op, flags,currentmin);
  205. }
  206.  
  207. inline Gfx*  GetClosestGfx(Rectangle &p, Point* gp=0, Point*op=0, int flags = eGfxShown, int* currentmin =0 )
  208. {
  209.     return GetClosestGfx((void*)&p, eRectangle, gp, op, flags,currentmin);
  210. }
  211.  
  212. inline Gfx*  GetClosestGfx(Oval &p, Point* gp=0, Point*op=0, int flags = eGfxShown, int* currentmin =0 )
  213. {
  214.     return GetClosestGfx((void*)&p, eOval, gp, op, flags,currentmin);
  215. }
  216.  
  217. inline Gfx*  GetClosestGfx(PointArray & p, Point* gp=0, Point*op=0, int flags = eGfxShown, int*currentmin =0 )
  218. {
  219.     return GetClosestGfx((void*)&p, ePointArray, gp, op, flags,currentmin);
  220. }
  221.  
  222.  
  223. virtual int DistanceTo(Point &);
  224. virtual int DistanceTo(Line &);
  225. virtual int DistanceTo(Rectangle & );
  226. virtual int DistanceTo(PointArray&);
  227. virtual int DistanceTo(Oval & r );
  228.  
  229. Point ClosestPoint(void* g, ShapeType t,Point* op =0,bool attach = FALSE);
  230. virtual Point  ClosestPoint(Point &,bool attach = FALSE);
  231. virtual Point  ClosestPoint(Line & ,Point*op = 0 );
  232. virtual Point  ClosestPoint(Rectangle &,Point*op = 0  );
  233. virtual Point  ClosestPoint(Oval &,Point*op = 0  );
  234. virtual Point  ClosestPoint( PointArray &,Point*op = 0 );
  235.  
  236.  
  237. virtual  void GetAllGfxWithId(int i,Set & s);
  238.  
  239. virtual Gfx*  GetGfx(Class* c = 0, int id = -1,int flags = 0);
  240. virtual Gfx*  GetGfxOnPt(Point p, Class* c = 0, int id = -1,int flags = eGfxShown);
  241. virtual Gfx*  GetGfxOnRect(Rectangle r, Class* c = 0 , int id = -1,int flags = eGfxShown);
  242.  
  243. Gfx* GetGfxWithId(int i,int flags = 0){return GetGfx(0,i,flags);}
  244. Gfx* GetGfxWithIdOnPt(int i,Point p,int flags = eGfxShown){return GetGfxOnPt(p,0,i,flags);}
  245. Gfx* GetGfxWithIdOnRect(int i,Rectangle r,int flags = eGfxShown){return GetGfxOnRect(r,0,i,flags);}
  246.  
  247. Gfx*  GetGfxOfClass(Class* c,int flags = eGfxShown) {return GetGfx(c,-1,flags);}
  248. Gfx*  GetGfxOfClassOnPt(  Class* c,Point p,int flags = eGfxShown){return GetGfxOnPt(p,c,-1,flags);}
  249. Gfx*  GetGfxOfClassOnRect( Class* c, Rectangle r,int flags = eGfxShown) {return GetGfxOnRect(r,c,-1,flags);}
  250.  
  251.  
  252.  
  253.  
  254. Font* GetFont(){
  255.     if(!HaveFontDefined()) return gSysFont;
  256.     return   new_Font(GetTextFont(),GetTextSize(), GetTextFace());
  257. }
  258.  
  259.  
  260.  
  261.  
  262. inline void SetBatch(bool b){
  263.     if(b == TestFlag(eGfxBatching)) return;
  264.     SetFlag(eGfxBatching,b);
  265.     if(!b)     CalcImageBBox();
  266. }
  267.  
  268. inline bool Batching(){return (TestFlag(eGfxBatching) ? TRUE: (parent ? parent->Batching():FALSE));}
  269.  
  270. void Init();
  271.  
  272. void SetElement(VGraphElement* g=0) {
  273.     BEGINGUARD(eGfxGuard)
  274.     SetElement2(g);    
  275.     ENDGUARD(eGfxGuard)
  276. }
  277.  
  278. virtual void SetElement2(VGraphElement* g=0) {    elt = g;}
  279.  
  280.  
  281.  
  282. inline VGraphElement* GetElement() {return (elt? elt : (parent? parent->GetElement(): 0));}
  283.  
  284. inline void SetParent(Gfx* p=0) {    parent = p; SignalNewFont();}
  285.  
  286. inline Gfx* GetParent() {return parent;}
  287.  
  288.  
  289. virtual void ToFront(Gfx* g = 0);
  290. virtual void ToBack(Gfx* g = 0);
  291.  
  292. void* GetAttribute(int aid, DataType & type);
  293. void ChangeAttribute(int aid, void* data, DataType type);
  294. AttrMap*    MapAttribute(int external, int internal, Object* fromobj, AttrFilter* af=0);
  295.  
  296. virtual bool GetLocPt(LocPt lp , Point* p,void* data =0 );
  297.  
  298.  
  299. inline void SetFilled(bool f){SetFlag(eGfxFilled,f);SignalChange(ibbox);}
  300. inline bool GetFilled(){return (TestFlag(eGfxFilled));}
  301.  
  302.  
  303. inline bool Attachable(){
  304.     return (TestFlag(eGfxAttachable) && (parent ? parent->Attachable():TRUE)); 
  305. }
  306.  
  307.  
  308. inline void SetAttachable(bool s){    SetFlag(eGfxAttachable,s);}
  309.  
  310.  
  311. inline bool Pickable()
  312. {
  313.     return (TestFlag(eGfxPickable) && (parent ? parent->Pickable():TRUE)); 
  314.  
  315. }
  316.  
  317.  
  318. inline void SetPickable(bool s){
  319.     SetFlag(eGfxPickable,s);
  320. }
  321.  
  322.  
  323.  
  324.  
  325. inline Gfx* GetRoot(){return (parent?parent->GetRoot():this);}
  326.  
  327.  
  328.  
  329. inline bool CanShow(){
  330.     return ( 
  331.         ((elt && ! elt->GetVisible()) ? FALSE:  
  332.          (TestFlag(eGfxShown) && (parent ? parent->CanShow(): TRUE)))
  333.         );
  334. }
  335.  
  336.  
  337. inline void SetShown(bool s){
  338.     if(s != TestFlag(eGfxShown)){
  339.         SetFlag(eGfxShown,s);
  340.         SignalChange(ibbox);
  341.         ibbox = gRect0;
  342.         CalcImageBBox();
  343.     }
  344. }
  345.  
  346.  
  347. //Graphics state functions
  348.  
  349. inline bool HaveFillColor(){return (gfxstate && (gfxstate->fillcolor != eNullColor));}
  350. inline bool HavePenColor(){return (gfxstate && (gfxstate->pencolor != eNullColor));}
  351. inline bool HavePenSize(){return (gfxstate && (gfxstate->penwidth != NULLSIZE));}
  352. inline bool HaveTextFace(){return (gfxstate && (gfxstate->textface  != NULLTEXTFACE));}
  353. inline bool HaveTextSize(){return (gfxstate && (gfxstate->textsize  != NULLTEXTSIZE));}
  354. inline bool HaveTextColor(){return (gfxstate && (gfxstate->textcolor  != eNullColor));}
  355. inline bool HaveTextFont(){return (gfxstate && (gfxstate->textfont  != NULLTEXTFONT));}
  356.  
  357.  
  358. inline void SetFillColor (ESCALANTEColor fc = eNullColor) {
  359.     if(fc <0 || fc > (int)eLastColor) return;
  360.     CheckGfxState();
  361.     if(gfxstate->fillcolor == fc) return;
  362.     gfxstate->fillcolor = fc;
  363.     gfxstate->fgrey =0;
  364.     SignalChange(ibbox);
  365.  
  366. }
  367.  
  368. inline void SetFillColor (float perc){
  369.     CheckGfxState();
  370.     gfxstate->fgrey = GetGrey(perc);
  371. //    gfxstate->fillcolor = PercentToGrey(perc);
  372.     SignalChange(ibbox);
  373. }
  374.  
  375. inline ESCALANTEColor GetFillColor(){
  376.     return
  377.         (HaveFillColor() ? gfxstate->fillcolor:
  378.          (parent? parent->GetFillColor() :(ESCALANTEColor)e_ePatNone));
  379. }
  380.  
  381.  
  382. inline ESCALANTEColor GetPenColor(){return (HavePenColor() ? gfxstate->pencolor:
  383.                 (parent? parent->GetPenColor() :(ESCALANTEColor)DefaultColor));}
  384.  
  385. inline void SetPenColor(ESCALANTEColor pc = eNullColor) {
  386.     if(pc <0 || pc > (int)eLastColor) return;
  387.     CheckGfxState();
  388.     if(gfxstate->pencolor == pc) return;
  389.     gfxstate->pencolor = pc;
  390.     gfxstate->fgrey = 0;
  391.     SignalChange(ibbox);
  392. }
  393.  
  394.  
  395. inline void SetPenColor (float perc){
  396.     CheckGfxState();
  397.     gfxstate->pgrey = GetGrey(perc);
  398. //    gfxstate->pencolor = PercentToGrey(perc);
  399.     SignalChange(ibbox);
  400. }
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409. inline int GetPenSize(){return (HavePenSize() ? gfxstate->penwidth:
  410.               (parent? parent->GetPenSize() :DefaultSize));}
  411.  
  412.  
  413. inline void SetPenSize(int pw = NULLSIZE) {
  414.     CheckGfxState();
  415.     if(gfxstate->penwidth == pw) return;
  416.     gfxstate->penwidth = pw;
  417.     CalcImageBBox();
  418. }
  419.  
  420.  
  421.  
  422. virtual void SignalNewFont(){}
  423.  
  424. inline void SetTextFace(ESCALANTEFace f) { 
  425.     CheckGfxState();
  426.     if(gfxstate->textface == f) return;
  427.     gfxstate->textface = f; 
  428.     SignalNewFont();
  429.     SignalChange(ibbox);
  430. }
  431.  
  432. inline ESCALANTEFace GetTextFace() {
  433.     return     (HaveTextFace() ?     gfxstate-> textface:
  434.          (parent ? parent->GetTextFace ():(ESCALANTEFace) DFLTFACE));
  435. }
  436.  
  437.  
  438.  
  439. inline void SetTextSize(int s ) {
  440.         CheckGfxState();
  441.         if(gfxstate->textsize == s) return;
  442.         gfxstate->textsize = s; 
  443.         SignalNewFont();
  444.         CalcImageBBox();
  445.  
  446. }
  447.  
  448.  
  449. inline int GetTextSize() {
  450.     return     (HaveTextSize() ? gfxstate->textsize:
  451.          (parent ? parent->GetTextSize (): DFLTSIZE) );
  452. }
  453.  
  454.  
  455.  
  456. inline void SetTextColor(ESCALANTEColor c ) {
  457.     if(c <0 || c > (int)eLastColor) return;
  458.     CheckGfxState();
  459.     if(gfxstate->textcolor == c) return;
  460.     gfxstate->textcolor = c; 
  461.     SignalChange(ibbox);
  462. }
  463.  
  464.  
  465. inline void SetTextColor (float perc){
  466.     CheckGfxState();
  467.     gfxstate->textcolor = PercentToGrey(perc);
  468.     SignalChange(ibbox);
  469. }
  470.  
  471.  
  472. inline ESCALANTEColor  GetTextColor() {
  473.     return     (HaveTextColor() ? gfxstate->textcolor:
  474.          (parent ? parent->GetTextColor() : (ESCALANTEColor)DefaultColor));
  475. }
  476.  
  477.  
  478.  
  479.  
  480. inline void SetTextFont(ESCALANTEFont f ) {
  481.     CheckGfxState();
  482.     if(gfxstate->textfont == f) return;
  483.     gfxstate->textfont = f; 
  484.     SignalNewFont();
  485.     CalcImageBBox();
  486. }
  487.  
  488. bool HaveFontDefined(){
  489.     if(HaveTextFont()) return TRUE;
  490.     if(parent) return parent->HaveFontDefined();
  491.     return FALSE;
  492. }
  493.  
  494. inline ESCALANTEFont GetTextFont() {
  495.     return     (HaveTextFont() ? gfxstate->textfont:
  496.          (parent ? parent->GetTextFont (): (ESCALANTEFont)DFLTFONT) );
  497. }
  498.  
  499.  
  500.  
  501.  
  502. void SignalChange(Rectangle r );
  503. Rectangle AdjustRectangle(Rectangle r);
  504.  
  505.  
  506. Rectangle        CalcImageBBox(); 
  507. Rectangle        ResetImageBBox();
  508. virtual    Rectangle    ResetImageBBox2(){return CalcImageBBox();}
  509. virtual    Rectangle    CalcImageBBox2();
  510. inline    Rectangle    GetImageBBox(){return ibbox;}
  511.  
  512.  
  513.  
  514. Point GetPointOfElt(LocPt lp);
  515.  
  516. void DrawInit(Rectangle r= gRect0, void* v =0);
  517. virtual void Draw(Rectangle r,class View* v);
  518.  
  519. bool DrawOutline(){return TestFlag(eGfxDrawOutline);}
  520. virtual void DrawOutline(bool b){ 
  521.     if(b == TestFlag(eGfxDrawOutline)) return;
  522.     SetFlag(eGfxDrawOutline,b);
  523.     SignalChange(ibbox);
  524.     CalcImageBBox();
  525. }
  526.  
  527. virtual void     Setup();
  528.  
  529.  
  530.  
  531. OStream&    PrintOn(OStream& o);
  532. IStream&    ReadFrom(IStream& i );
  533. };
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540. #endif GFX_H
  541.